// 1. 引入内置模块：stream（可读流基类）
const { Readable } = require('stream');

// 2. 自定义可读流类 MyReadable，继承 Readable
class MyReadable extends Readable {
  constructor() {
    super(); // 调用父类 Readable 的构造函数
    this.currentCharCode = 97; // 'a' 的ASCII码是97，从a开始
  }

  // 3. 核心方法：_read（必须实现，流会自动调用此方法读取数据）
  // size：建议读取的数据大小（可选，此处忽略，按需求输出a-z）
  _read(size) {
    const char = String.fromCharCode(this.currentCharCode); // 将ASCII码转为字符

    // 4. 推送数据到流的输出队列：push(data)
    // - 若data不为null：继续推送数据；
    // - 若data为null：表示流结束，不再推送数据。
    this.push(char);

    // 5. 更新当前字符的ASCII码，直到'z'（ASCII码122）
    if (this.currentCharCode === 122) {
      this.push(null); // 推送null，标记流结束
    }
    this.currentCharCode++;
  }
}

// 6. 创建 MyReadable 实例
const myReadableStream = new MyReadable();

// 7. 管道连接：自定义可读流 → 终端输出流（process.stdout 是可写流）
myReadableStream.pipe(process.stdout);

// 8. 监听流结束事件，提示完成
myReadableStream.on('end', () => {
  console.log('\n（自定义可读流已结束，已输出a-z）');
});